Cuenta la leyenda que durante el Aislamiento Social Preventivo y Obligatorio del 2020, muchos habitantes de la ciudad de Buenos Aires incorporaron el hĆ”bito de separar residuos como conducta ecológica. En mi caso fue sencillo sumarme al movimiento āorgĆ”nico e inorgĆ”nico, asunto separadoā ya que cerca de mi casa se ubican 2 Campanas Verdes (nombre prolijo de los contenedores para reciclables) y un Punto Verde. Pero un amigo, que tambiĆ©n quiso empezar a separar residuos, me contó que le habĆa costado encontrar un container verde cerca de su casa y que cuando quiso buscar en la pĆ”gina del GCBA se encontró con un excel inmenso que no pudo entender. En ese momento pensĆ©, esta es una tarea para poner la ciencia de datos al servicio de la comunidad. AsĆ que lo primero que pensĆ© fue en armar un mapa interactivo, pero posteriormente algunas preguntas fueron surgiendo. El siguiente es un pequeƱo anĆ”lisis de la distribución de puntos reciclables en CABA y su relación con la distribución poblacional.
āCampanas verdesā
āPuntos Verdesā
Primero vamos a descargar la data a usar para el anƔlisis, en principio en estos links
https://data.buenosaires.gob.ar/dataset/campanas-verdes
https://data.buenosaires.gob.ar/dataset/puntos-verdes/resource/juqdkmgo-1716-resource
https://www.estadisticaciudad.gob.ar/eyc/?p=76599
Y vamos a levantar los datasets con R
# install.packages("tidyverse")
# install.packages("rgdal")
# install.packages("readxl")
library(tidyverse)
library(rgdal)
library(readxl)
campanas_verdes<-read.csv("campanas-verdes.csv", encoding = "UTF-8")
poblacion<-read_xlsx("PDE.xlsx",
sheet = "2020",
skip = 1)%>%
slice(3:17)%>%
rename("varones"="...3",
"mujeres"="...4", "comuna"="Comuna",
"superficie"="Superficie (km2)",
"poblacion"="Población")%>%
mutate(comuna=as.factor(comuna),
poblacion=as.numeric(poblacion))
Exploremos un poco la estructura de la data levantada
glimpse(campanas_verdes)
## Rows: 2,974
## Columns: 6
## $ WKT <chr> "POINT (-58.4436445327415 -34.5893377789048)", "POINT (-58.~
## $ direccion <chr> "AGUIRRE 1447", "BERMUDEZ 1697", "CACHI 163", "CERVANTES 38~
## $ barrio <chr> "CHACARITA", "MONTE CASTRO", "NUEVA POMPEYA", "VILLA DEVOTO~
## $ comuna <int> 15, 10, 4, 11, 15, 15, 15, 15, 15, 15, 5, 5, 5, 5, 5, 8, 10~
## $ materiales <chr> "Papel / Cartón", "Papel / Cartón", "Papel / Cartón / PlÔst~
## $ mas_info <chr> "Los materiales deben estar limpios y secos", "Los material~
glimpse(poblacion)
## Rows: 15
## Columns: 6
## $ comuna <fct> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1~
## $ poblacion <dbl> 256405, 149430, 193276, 240100, 1875~
## $ varones <chr> "127651", "66707", "91310", "114957"~
## $ mujeres <chr> "128754", "82723", "101966", "125143~
## $ superficie <dbl> 17.76490, 6.30245, 6.38500, 21.66900~
## $ `Densidad poblacional (hab/km2)` <dbl> 14433.24, 23709.83, 30270.32, 11080.~
Veamos la distribucion de campanas por comuna
#armo un df con la data que voy a necesitar para graficar
campanas_por_comuna<-campanas_verdes%>%
group_by(comuna)%>%
summarise(cantidad=n())%>%
mutate(comuna=as.factor(comuna))%>%
arrange(cantidad)
#grafico el df
plot_campanas_por_comuna<-ggplot(data = campanas_por_comuna, aes(x=reorder(comuna, cantidad),
y=cantidad,
fill=comuna))+
theme(axis.text.x = element_text(angle = 45))+
labs(title = "Cantidad de campanas verdes por comuna",
x= "comuna",
fill= "comuna")+
geom_bar(stat = "identity", position = "identity")+
coord_flip()
#meto un plotly para que sea interactivo
library(plotly)
ggplotly(plot_campanas_por_comuna,tooltip = c("cantidad", "comuna"))
Bien! Ya tenemos nuestros primeros datos. En principio vemos que las comunas que tienen mayor cantidad de campanas verdes son las 13, 12 y 10 y las que menor cantidad tienen son la 2, 3 y 1. Pero esta informacion mucho no nos dice. Veamos la cantidad de campanas verdes por habitante de cada comuna, asĆ podemos ver la densidad de campanas verdes.
#junto la data
campanas_por_comuna<-campanas_por_comuna%>%
inner_join(poblacion, campanas_por_comuna, by="comuna")%>%
mutate(densidad=round(poblacion/cantidad, digits = 0))
| comuna | cantidad | poblacion | varones | mujeres | superficie | Densidad poblacional (hab/km2) | densidad |
|---|---|---|---|---|---|---|---|
| 2 | 85 | 149430 | 66707 | 82723 | 6.30245 | 23709.83 | 1758 |
| 3 | 114 | 193276 | 91310 | 101966 | 6.38500 | 30270.32 | 1695 |
| 1 | 117 | 256405 | 127651 | 128754 | 17.76490 | 14433.24 | 2191 |
| 14 | 121 | 227115 | 102784 | 124331 | 15.84650 | 14332.19 | 1877 |
| 6 | 129 | 185456 | 84790 | 100666 | 6.85100 | 27069.92 | 1438 |
| 5 | 162 | 187518 | 86312 | 101206 | 6.65905 | 28159.87 | 1158 |
| 7 | 166 | 241861 | 113923 | 127938 | 12.42760 | 19461.60 | 1457 |
| 8 | 169 | 228953 | 109653 | 119300 | 22.29200 | 10270.64 | 1355 |
| 4 | 171 | 240100 | 114957 | 125143 | 21.66900 | 11080.35 | 1404 |
| 11 | 237 | 190076 | 89756 | 100320 | 14.11930 | 13462.14 | 802 |
| 15 | 269 | 182465 | 85398 | 97067 | 14.32271 | 12739.56 | 678 |
| 9 | 278 | 171264 | 82856 | 88408 | 16.50600 | 10375.86 | 616 |
| 10 | 292 | 170592 | 80065 | 90527 | 12.65690 | 13478.18 | 584 |
| 12 | 331 | 214777 | 100392 | 114385 | 15.56760 | 13796.41 | 649 |
| 13 | 333 | 236358 | 107991 | 128367 | 14.65175 | 16131.73 | 710 |
Grafico para entender la distribución de campanas verdes por comuna
plot_densidad<-ggplot(campanas_por_comuna, aes(x=poblacion, y=cantidad, color=comuna, lab1=densidad))+
geom_point(size=3)+
labs(title = "Cantidad de campanas verdes segĆŗn cantidad de habitantes")
ggplotly(plot_densidad, tooltip = c("cantidad", "comuna", "densidad"))
Bueno ahora tenemos un poco mĆ”s de información. En principio uno esperarĆa que el grĆ”fico tuviera una forma de pendiente desde el rincón inferior izquierdo hasta el superior derecho, es decir que a mayor cantidad de habitantes (asumiendo que cada habitante produce una cantidad de residuos similar), mayor cantidad de campanas verdes. Pero esto no es lo que sucede, por ejemplo vemos que la comuna 1 es la que peor relación presenta entre cantidad de población y cantidad de campanas verdes disponibles. El grĆ”fico no estĆ” mal, pero tratemos de ver la info con un poco mas de detalle, y para esto nada mejor que un mapa
#cargamos una nueva libreria
library(sf)
#traigamos la informacion geografica de las comunas en caba
comunas<-st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/comunas/CABA_comunas.geojson")%>%
mutate(comuna=as.factor(COMUNAS))
## Reading layer `comunas' from data source
## `http://cdn.buenosaires.gob.ar/datosabiertos/datasets/comunas/CABA_comunas.geojson'
## using driver `GeoJSON'
## Simple feature collection with 15 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -58.53152 ymin: -34.70529 xmax: -58.33515 ymax: -34.52649
## Geodetic CRS: WGS 84
#juntemos nuestra data para poder graficar, vamos a necesitar
#que nos quede un objeto de tipo sf
campanas_por_comuna<-left_join(comunas, campanas_por_comuna, by="comuna")
#grafiquemos un mapa
mapa_comunas<-ggplot(campanas_por_comuna, aes(fill=densidad))+
geom_sf()+
scale_fill_distiller("Cantidad de habitantes por campana", palette = "Reds", direction = 1)+
labs(title = "Densidad de campanas verdes")
ggplotly(mapa_comunas)
Por último armemos el mapa que necesitaba mi amigo para poder ubicar los puntos verdes cerca de su casa. Vamos a agregar también la info de los Puntos Verdes. Ahora cualquier persona puede consultarlo!
library(leaflet)
campanas_verdes_shp<-readOGR("contenedores_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\ds-menta\Desktop\Joaquin\unsam\TP\contenedores_verdes_wgs84.shp", layer: "contenedores_verdes_wgs84"
## with 2974 features
## It has 5 fields
puntos_verdes_shp<-readOGR("puntos_verdes_wgs84.shp")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\Users\ds-menta\Desktop\Joaquin\unsam\TP\puntos_verdes_wgs84.shp", layer: "puntos_verdes_wgs84"
## with 80 features
## It has 13 fields
## Integer64 fields read as strings: altura
mapa_reciclables<-leaflet()%>%
addProviderTiles("OpenStreetMap.Mapnik")%>%
addMarkers(data=campanas_verdes_shp,
group = "contenedores para reciclables",
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds = F))%>%
addMarkers(data=puntos_verdes_shp,
group = "puntos verdes",
clusterOptions = markerClusterOptions(removeOutsideVisibleBounds = F))%>%
addLayersControl(position = "bottomleft",
overlayGroups = c("contenedores para reciclables", "puntos verdes"))
mapa_reciclables